gusucode.com > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM源码程序 > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM\LS_SVMlab\AFE.m

    function [features,eigvec,eigvals] = AFE(Xs,kernel, kernel_pars,X,type,nb,eigvec,eigvals)
% Automatic Feature Extraction by Nystr鰉 method
%
%
% >> features = AFE(X, kernel, sig2, Xt)
%
% Description
% Using the Nystr鰉 approximation method, the mapping of data to
% the feature space can be evaluated explicitly. This gives the
% features that one can use for a linear regression or
% classification. The decomposition of the mapping to the feature
% space relies on the eigenvalue decomposition of the kernel
% matrix. The Matlab ('eigs') or Nystr鰉's ('eign') approximation
% using the nb most important eigenvectors/eigenvalues can be
% used. The eigenvalue decomposition is not re-calculated if it is
% passed as an extra argument. This routine internally calls a cmex file.
%
% Full syntax
% 
% >> [features, U, lam] = AFE(X, kernel, sig2, Xt) 
% >> [features, U, lam] = AFE(X, kernel, sig2, Xt, type) 
% >> [features, U, lam] = AFE(X, kernel, sig2, Xt, type, nb) 
% >> features          = AFE(X, kernel, sig2, Xt, [],[], U, lam)
% 
% Outputs    
%   features : Nt x nb matrix with extracted features
%   U(*)     : N x nb matrix with eigenvectors
%   lam(*)   : nb x 1 vector with eigenvalues
% Inputs    
%   X      : N x d matrix with input data
%   kernel : Name of the used kernel (e.g. 'RBF_kernel')
%   sig2   : parameter of the used kernel
%   Xt     : Data from which the features are extracted
%   type(*): 'eig'(*), 'eigs' or 'eign'
%   nb(*)  : Number of eigenvalues/eigenvectors used in the eigenvalue decomposition approximation
%   U(*)   : N x nb matrix with eigenvectors
%   lam(*) : nb x 1 vector with eigenvalues
% 
% See also:
%   kernel_matrix, RBF_kernel, demo_fixedsize

% Copyright (c) 2002,  KULeuven-ESAT-SCD, License & help @ http://www.esat.kuleuven.ac.be/sista/lssvmlab


[N,dim] = size(X);
[Nc,dim] = size(Xs);

eval('type;','type=''eig'';');
if ~(strcmp(type,'eig') | strcmp(type,'eigs') | strcmp(type,'eign'))
  error('Type needs to be ''eig'', ''eigs'' or ''eign''...');
end
  

% eigenvalue decomposition to do..
if nargin<=6,
  omega = kernel_matrix(Xs, kernel, kernel_pars);
  if strcmp(type,'eig'),
    [eigvec,eigvals] = eig(omega+2*eye(size(omega,1))); % + jitter factor
    eigvals = diag(eigvals);
  elseif strcmp(type,'eigs'),
    eval('nb;','nb=min(size(omega,1),10);');
    [eigvec,eigvals] = eigs(omega+2*eye(size(omega,1)),nb); % + jitter factor
  elseif strcmp(type,'eign'),
    eval('nb;','nb=min(size(omega,1),10);');
    [eigvec,eigvals] = eign(omega+2*eye(size(omega,1)),nb); % + jitter factor
  end
  eigvals = (eigvals-2)/Nc;
  peff = eigvals>eps;
  eigvals = eigvals(peff);
  eigvec = eigvec(:,peff);
end
  
% Cmex
features = phitures(Xs',X',eigvec,eigvals,kernel, kernel_pars);